package com.example.leetcode.c801_c900.c861;
/**
 * 有一个二维矩阵 A 其中每个元素的值为 0 或 1 。
 *
 * 移动是指选择任一行或列，并转换该行或列中的每一个值：将所有 0 都更改为 1，将所有 1 都更改为 0。
 *
 * 在做出任意次数的移动后，将该矩阵的每一行都按照二进制数来解释，矩阵的得分就是这些数字的总和。
 *
 * 返回尽可能高的分数。
 *
 *  
 *
 * 示例：
 *
 * 输入：[[0,0,1,1],[1,0,1,0],[1,1,0,0]]
 * 输出：39
 * 解释：
 * 转换为 [[1,1,1,1],[1,0,0,1],[1,1,1,1]]
 * 0b1111 + 0b1001 + 0b1111 = 15 + 9 + 15 = 39
 *  
 *
 * 提示：
 *
 * 1 <= A.length <= 20
 * 1 <= A[0].length <= 20
 * A[i][j] 是 0 或 1
 *
 * 来源：力扣（LeetCode）
 * 链接：https://leetcode-cn.com/problems/score-after-flipping-matrix
 * 著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
 */

/**
 * 翻转矩阵后的得分
 * @author zhanpengguo
 * @date 2020-12-07 8:14
 */
public class Solution {

    public int matrixScore(int[][] A) {
        int m = A.length;
        int n = A[0].length;
        // 翻转行
        for (int i = 0; i < m; i++) {
            // 这一行的第一个数字
            int f = A[i][0];
            for (int j = 0; j < A[i].length; j++) {
                int a = A[i][j];
                // 如果第一个是0，就翻转
                A[i][j] = f == 0 ? 1 - a : a;
            }
        }
        // 翻转列，从第二列开始
        for (int j = 1; j < n; j++) {
            int count1 = 0;
            for (int i = 0; i < m; i++) {
                count1 += A[i][j];
            }
            if (count1 <= m / 2) {
                //翻转
                for (int i = 0; i < m; i++) {
                    A[i][j] = 1 - A[i][j];
                }
            }
        }
        //计算总和
        int sum = 0;
        for (int i = 0; i < m; i++) {
            int temp = 0;
            for (int j = 0; j < n; j++) {
                temp += (A[i][j] << (n - j - 1));
            }
            sum += temp;
        }
        return sum;
    }

    public static void main(String[] args) {
        int[][] A = {{0, 0, 1, 1}, {1, 0, 1, 0}, {1, 1, 0, 0}};
        Solution solution = new Solution();
        int i = solution.matrixScore(A);
        System.out.println(i);
    }

}
